/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Servidor;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.MulticastSocket;
import java.net.UnknownHostException;
import java.util.ArrayList;

/**
 *
 * @author Murilo
 */
public class Servidor {
    
    private int IdServidor;
    private int NumeroObjetosServidor;
    private InetAddress IpGrupo;
    private int PortaGrupo;
    private MulticastSocket socketServidor;
    private DatagramSocket socketRespostaProxy;
    private InetAddress ServidorProxyIp;
    private ArrayList<DadosObjeto> ObjetosServidor;
    private int PortaServidorProxy;
    
    public Servidor(int IdServidor, int QntdObjetos) throws UnknownHostException, IOException {
        this.IpGrupo = InetAddress.getByName("224.0.0.1");
        this.PortaGrupo = 2001;
        this.socketServidor = new MulticastSocket(this.PortaGrupo);
        this.socketRespostaProxy = new DatagramSocket();
        
        
        
        this.IdServidor = IdServidor;
        this.NumeroObjetosServidor = QntdObjetos;
        this.ObjetosServidor = new ArrayList<>();
        criarObjetosServidor();
    }
    
    public void entrarNoGrupo() throws IOException {
        this.socketServidor.joinGroup(this.IpGrupo);
    }
    
    public void sairdoGrupo() throws IOException {
        this.socketServidor.leaveGroup(this.IpGrupo);
    }
    
    public void receberObjetoServidorProxy() throws IOException {
        byte[] buffer = new byte[512];
        DatagramPacket requisicaoServidorProxy = new DatagramPacket(buffer, buffer.length);
        this.socketServidor.receive(requisicaoServidorProxy);
        String dadosObjeto = new String(requisicaoServidorProxy.getData(), requisicaoServidorProxy.getOffset(),
                requisicaoServidorProxy.getLength());
        System.err.println("Objeto recebido do Servidor Proxy: " + dadosObjeto);
        String[] aux = dadosObjeto.split("/");
        this.PortaServidorProxy = Integer.valueOf(aux[1]);
        this.ServidorProxyIp = requisicaoServidorProxy.getAddress();
        
        //verifica se o objeto existe nesse servidor
        this.verificaObjetoRequisicaoServidorProxy(aux[0]);
    }
    
    public void criarObjetosServidor(){
        int inicio, fim;
        inicio = ((this.NumeroObjetosServidor * this.IdServidor)+(this.NumeroObjetosServidor * -1)) + 1;
        fim = this.NumeroObjetosServidor * this.IdServidor;
        for(; inicio <= fim; inicio++){
            DadosObjeto obj = new DadosObjeto();
            obj.setIdObjeto(inicio);
            obj.setTamanhoBytes((int) (Math.random() * 100));
            this.ObjetosServidor.add(obj);
            System.err.println(obj.getIdObjeto());
        }
    }
    
    public void verificaObjetoRequisicaoServidorProxy(String IdObjeto) throws IOException{
        for(DadosObjeto obj : this.ObjetosServidor){
            if(obj.getIdObjeto() == Integer.valueOf(IdObjeto)){
                this.responderServidorProxy(obj);
            }
        }
    }
    
    public void responderServidorProxy(DadosObjeto obj) throws IOException{
        String resposta = String.valueOf(obj.getIdObjeto()) + "/" + String.valueOf(obj.getTamanhoBytes());
        byte[] buffer = resposta.getBytes();
        
        DatagramPacket datagramaResposta = new DatagramPacket(buffer, buffer.length,
                this.ServidorProxyIp, this.PortaServidorProxy);
        //Envia o datagrama para o receptor
        this.socketRespostaProxy.send(datagramaResposta);
    }
    
}
